package com.zliblike_platform.service;

import com.zliblike_platform.dto.BookDownloadDTO;
import com.zliblike_platform.dto.BookUploadDTO;
import com.zliblike_platform.dto.FormatConversionDTO;
import com.zliblike_platform.entity.Book;
import com.zliblike_platform.vo.BookInfoVO;
import com.zliblike_platform.vo.BookUploadResultVO;
import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 书籍服务接口
 */
public interface BookService {
    
    /**
     * 获取书籍信息
     * @param bookId 书籍ID
     * @return 书籍信息
     */
    BookInfoVO getBookInfo(Long bookId);
    
    /**
     * 下载电子书
     * @param userId 用户ID
     * @param downloadDTO 下载参数
     * @param response HTTP响应
     */
    void downloadBook(Long userId, BookDownloadDTO downloadDTO, HttpServletResponse response);
    
    /**
     * 获取书籍可用格式
     * @param bookId 书籍ID
     * @return 可用格式列表
     */
    List<String> getAvailableFormats(Long bookId);
    
    /**
     * 请求格式转换
     * @param userId 用户ID
     * @param conversionDTO 转换参数
     * @return 转换请求ID
     */
    Long requestFormatConversion(Long userId, FormatConversionDTO conversionDTO);
    
    /**
     * 检查用户下载权限
     * @param userId 用户ID
     * @return 是否有下载权限
     */
    boolean checkDownloadPermission(Long userId);
    
    /**
     * 增加书籍受欢迎度
     * @param bookId 书籍ID
     * @param score 分数
     */
    void increasePopularity(Long bookId, Integer score);
    
    /**
     * 上传电子书
     * @param userId 用户ID
     * @param uploadDTO 上传参数
     * @return 上传结果
     */
    BookUploadResultVO uploadBook(Long userId, BookUploadDTO uploadDTO);
    
    /**
     * 检查ISBN是否已存在
     * @param isbn ISBN
     * @return 是否存在
     */
    boolean isbnExists(String isbn);
    
    /**
     * 获取支持的文件格式
     * @return 支持的文件格式列表
     */
    List<String> getFormats();
    
    /**
     * 获取最受欢迎的书籍
     * @param limit 查询数量
     * @return 书籍信息列表
     */
    List<BookInfoVO> getPopularBooks(Integer limit);
    
    /**
     * 根据分类获取最受欢迎的书籍
     * @param categoryId 分类ID
     * @param limit 查询数量
     * @return 书籍信息列表
     */
    List<BookInfoVO> getPopularBooksByCategory(Long categoryId, Integer limit);

    /**
     * 书籍格式转换
     * @param bookId 书籍ID
     * @param targetFormat 目标格式 (EPUB, MOBI, PDF)
     * @return 转换任务ID，如果转换失败返回null
     */
    Integer convertFormat(Integer bookId, String targetFormat);

    /**
     * 获取格式转换状态
     * @param convertId 转换任务ID
     * @return 转换状态 (waiting, processing, completed, failed)
     */
    String getConvertStatus(Integer convertId);

    /**
     * 获取转换后的书籍ID
     * @param convertId 转换任务ID
     * @return 转换后的书籍ID，如果转换未完成返回null
     */
    Integer getConvertedBookId(Integer convertId);

    /**
     * 获取书籍所有可用格式
     * @param bookId 书籍ID
     * @return 格式列表 (EPUB, MOBI, PDF)
     */
    List<String> getAvailableFormats(Integer bookId);

    /**
     * 更新书籍的受欢迎度
     * @param bookId 书籍ID
     * @param actionType 行为类型 (view, read, download, addToList, comment, rate)
     */
    void updatePopularity(Integer bookId, String actionType);

    /**
     * 获取最受欢迎的书籍
     * @param page 页码
     * @param size 每页大小
     * @return 书籍列表
     */
    List<BookInfoVO> getMostPopularBooks(int page, int size);
} 